import * as vscode from 'vscode';
import { replaceChinesePunctuation } from './punctuationMap';

let isEnabled = true;
let disposable: vscode.Disposable | undefined;
let replaceTimeout: NodeJS.Timeout | undefined;


export function activate(context: vscode.ExtensionContext) {

    const config = vscode.workspace.getConfiguration('chinesePunctuationReplacer');
    isEnabled = config.get('enabled', true);

    const enableCommand = vscode.commands.registerCommand('chinesePunctuationReplacer.enable', () => {
        isEnabled = true;
        vscode.window.showInformationMessage('中文标点符号替换已启用');
    });

    const disableCommand = vscode.commands.registerCommand('chinesePunctuationReplacer.disable', () => {
        isEnabled = false;
        vscode.window.showInformationMessage('中文标点符号替换已禁用');
    });

    // 监听文档变化
    const onDidChangeTextDocument = vscode.workspace.onDidChangeTextDocument((event) => {
        if (!isEnabled) {
            return;
        }

        const config = vscode.workspace.getConfiguration('chinesePunctuationReplacer');
        const replaceOnType = config.get('replaceOnType', true);

        if (!replaceOnType) {
            return;
        }

        handleTextChange(event);
    });

    // 监听粘贴事件
    const onDidChangeTextEditorSelection = vscode.window.onDidChangeTextEditorSelection((event) => {
        if (!isEnabled) {
            return;
        }

        const config = vscode.workspace.getConfiguration('chinesePunctuationReplacer');
        const replaceOnPaste = config.get('replaceOnPaste', true);

        if (!replaceOnPaste) {
            return;
        }

        // 检查是否刚刚粘贴了内容
        setTimeout(() => {
            handlePasteReplacement();
        }, 100);
    });

    // 监听配置变化
    const onDidChangeConfiguration = vscode.workspace.onDidChangeConfiguration((event) => {
        if (event.affectsConfiguration('chinesePunctuationReplacer.enabled')) {
            const config = vscode.workspace.getConfiguration('chinesePunctuationReplacer');
            isEnabled = config.get('enabled', true);
        }
    });

    // 注册所有事件监听器
    context.subscriptions.push(
        enableCommand,
        disableCommand,
        onDidChangeTextDocument,
        onDidChangeTextEditorSelection,
        onDidChangeConfiguration
    );

    disposable = vscode.Disposable.from(
        enableCommand,
        disableCommand,
        onDidChangeTextDocument,
        onDidChangeTextEditorSelection,
        onDidChangeConfiguration
    );
}

/**
 * 处理文本变化事件
 */
function handleTextChange(event: vscode.TextDocumentChangeEvent) {
    const editor = vscode.window.activeTextEditor;
    if (!editor) {
        return;
    }

    const document = event.document;
    const changes = event.contentChanges;

    // 检查是否在代码文件中
    const fileName = document.fileName.toLowerCase();
    const isCodeFile = true; // 可以改成只在指定文件类型中生效
    
    // 检查是否允许在代码文件中替换
    const config = vscode.workspace.getConfiguration('chinesePunctuationReplacer');
    const replaceInCodeFiles = config.get('replaceInCodeFiles', false);

    for (const change of changes) {
        // 只处理插入操作
        if (change.text.length > 0) {
            const replacedText = replaceChinesePunctuation(change.text);
            
            // 如果文本发生了变化，进行替换
            if (replacedText !== change.text) {
                // 在代码文件中，根据配置决定是否替换
                if (isCodeFile && !replaceInCodeFiles) {
                    // 如果配置为不在代码文件中替换，则跳过
                    return;
                } else if (isCodeFile && replaceInCodeFiles) {
                    const safeReplacedText = replaceSafePunctuation(change.text);
                    if (safeReplacedText !== change.text) {
                        performReplacement(editor, change, safeReplacedText);
                    }
                } else {
                    performReplacement(editor, change, replacedText);
                }
            }
        }
    }
}

/**
 * 执行替换操作
 */
function performReplacement(editor: vscode.TextEditor, change: vscode.TextDocumentContentChangeEvent, replacedText: string) {
    const start = change.range.start;
    const end = change.range.end;
    
    const replaceRange = new vscode.Range(start, end.translate(0, 1));
    
    // 使用replace方法直接替换，并保持撤销历史
    editor.edit(editBuilder => {
        editBuilder.replace(replaceRange, replacedText);
    }, { undoStopBefore: false, undoStopAfter: true }).then(() => {
        // 只有在替换成英文句号"."时才触发代码补全，需要中文。触发的话可以调整一下逻辑
        if (replacedText === '.') {
            triggerCodeCompletion(editor, replaceRange.end);
        }
    });
}

/**
 * 触发代码补全
 */
function triggerCodeCompletion(editor: vscode.TextEditor, position: vscode.Position) {
    // 检查是否在代码文件中
    const fileName = editor.document.fileName.toLowerCase();
    const isCodeFile = true;
    
    if (isCodeFile) {
        // 设置光标位置到替换后的位置
        editor.selection = new vscode.Selection(position, position);
        
        // 延迟一点时间，让替换操作完成
        setTimeout(() => {
            // 触发代码补全
            vscode.commands.executeCommand('editor.action.triggerSuggest');
        }, 50);
    }
}

/**
 * 在代码文件中安全地替换标点符号，避免干扰代码补全
 */
function replaceSafePunctuation(text: string): string {
    // 只替换不会影响代码补全的标点符号
    const safeMap: { [key: string]: string } = {
        '，': ',',  // 逗号
        '。': '.',  // 句号
        '；': ';',  // 分号
        '：': ':',  // 冒号
        '？': '?',  // 问号
        '！': '!',  // 感叹号
        '\u201c': '"',  // 中文左双引号
        '\u201d': '"',  // 中文右双引号
        '\u2018': "'",  // 中文左单引号
        '\u2019': "'",  // 中文右单引号
        '（': '(',  // 括号
        '）': ')',  // 括号
        '【': '[',  // 方括号
        '】': ']',  // 方括号
        '｛': '{',  // 花括号
        '｝': '}',  // 花括号
    };

    return text.split('').map(char => safeMap[char] || char).join('');
}

/**
 * 处理粘贴后的替换
 */
function handlePasteReplacement() {
    const editor = vscode.window.activeTextEditor;
    if (!editor) {
        return;
    }

    const document = editor.document;
    const selection = editor.selection;
    
    if (selection.isEmpty) {
        return;
    }

    const selectedText = document.getText(selection);
    const replacedText = replaceChinesePunctuation(selectedText);
    
    if (replacedText !== selectedText) {
        editor.edit(editBuilder => {
            editBuilder.replace(selection, replacedText);
        });
    }
}

/**
 * 停用插件
 */
export function deactivate() {
    if (disposable) {
        disposable.dispose();
    }
    
    // 清理定时器
    if (replaceTimeout) {
        clearTimeout(replaceTimeout);
        replaceTimeout = undefined;
    }
}
